#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <emscripten.h>
#include "delaunay.h"
#include <vector>


// 为C接口定义的结构体
extern "C" {
    // 自定义内存管理函数声明
    void* wasm_malloc(size_t size);
    void wasm_free(void* ptr);
    // 简单的测试函数 - 计算两个整数的和
    EMSCRIPTEN_KEEPALIVE
    int add(int a, int b) {
        return a + b;
    }

    // 三角剖分函数
    // 接收顶点数组(x0, y0, x1, y1, ...)和顶点数量
    // 返回三角形索引数组(i0, j0, k0, i1, j1, k1, ...)
    EMSCRIPTEN_KEEPALIVE
    int* triangulate_points(float* vertices, int num_vertices, int* out_triangle_count) {
        // 检查输入参数
        if (!vertices || !out_triangle_count) {
            if (out_triangle_count) {
                *out_triangle_count = 0;
            }
            return nullptr;
        }
        if (num_vertices < 3) {
            *out_triangle_count = 0;
            return nullptr;
        }

        // 转换为Point向量
        try {
        // 执行三角剖分
        std::vector<int> triangles = triangulate(vertices, num_vertices);
            

            // 设置输出三角形数量
            *out_triangle_count = triangles.size() / 3;

            // 分配并复制结果
            int* result = nullptr;
            if (!triangles.empty()) {
                size_t result_size = triangles.size() * sizeof(int);
                result = static_cast<int*>(wasm_malloc(result_size));
                if (result) {
                    std::copy(triangles.begin(), triangles.end(), result);
                } else {
                    *out_triangle_count = 0;
                }
            }

            return result;
        } catch (const std::exception& e) {
            // 存储异常信息到共享内存
            const char* errorMsg = e.what();
            size_t errorLen = strlen(errorMsg) + 1;
            char* errorMem = static_cast<char*>(wasm_malloc(errorLen));
            if (errorMem) {
                strcpy(errorMem, errorMsg);
                // 可以在这里添加一个导出函数来获取异常信息
            }
            *out_triangle_count = 0;
            return nullptr;
        } catch (...) {
            *out_triangle_count = 0;
            return nullptr;
        }
    }

    // 分配内存（更改名称以避免与标准库冲突）
    EMSCRIPTEN_KEEPALIVE
    void* wasm_malloc(size_t size) {
        return std::malloc(size);
    }

    // 释放内存（更改名称以避免与标准库冲突）
    EMSCRIPTEN_KEEPALIVE
    void wasm_free(void* ptr) {
        std::free(ptr);
    }
}